// @Title main.go
// @Description xunso 主体程序.
// @Author  ${DATE} ${TIME}
// @Update  ${DATE} ${TIME}
package main

import (
	"flag"
	"fmt"
	"os"
	"strconv"

	htmlquery "github.com/antchfx/xquery/html"
	"golang.org/x/net/html"
)

// Entry 这个 struct 主要是用来接受 html 解析的.
type Entry struct {
	ID    int
	Title string
	URL   string
}

// QUERY 是用户输入参数 `movie` 的想查询的电影名称
var QUERY string

// HELP 是 用户输入的 `h` 提示信息.
var HELP bool

// URL 是 接口地址.
const URL string = "https://xunso.fun/search.html?keyword="

// @title init
// @description 初始化 flag 信息.
func init() {
	flag.StringVar(&QUERY, "movie", "", "查询想下载的电影名称.")
	flag.BoolVar(&HELP, "h", false, "显示 help 信息.")

	flag.Usage = func() {
		fmt.Println(`
Usage: xunso -movie=<Movie> [-h]

Options:
    `)
		flag.PrintDefaults()

		fmt.Print("\n\n")
		PrintColorful("Notice: 检索结果均来自互联网, 本程序不对结果的合法性和有效性负责.", 31)
		fmt.Print("\n")
	}
}

// PrintColorful return
// @description 彩色打印内容.
// @param content  string  "需要显示的内容"
// @param   color  int     "彩色显示的设置值" 30 黑色; 31 红色; 32 绿色; 33 黄色; 34 蓝色; 35 紫红色; 36 青蓝色; 37 白色;
func PrintColorful(content string, color int) {
	fmt.Printf(" %c[1;%dm%s%c[0m\n", 0x1B, color, content, 0x1B)
	// 下面和上面最大不同是下面 println 会有前景色.
	// 透明的 Command Shell 下很难看.
	// fmt.Printf(" %c[1;40;%dm%s%c[0m\n", 0x1B, color, content, 0x1B)
}

// ParseLink return
// @description 把链接转换为需要的 entry 数组.
// @param       url              string           "需要爬取的网页 URL."
// @return      (entries, err)   ([]Entry, error) "返回包含影片数据的 entry 数组. 或者错误"
func ParseLink(url string) ([]Entry, error) {
	doc, err := htmlquery.LoadURL(url)

	if err != nil {
		return nil, err
	}

	var entries []Entry
	htmlquery.FindEach(doc, "//a[@class='text_title_p']", func(i int, node *html.Node) {
		item := Entry{}
		item.ID = i
		item.Title = htmlquery.InnerText(node)
		item.URL = htmlquery.SelectAttr(node, "href")

		entries = append(entries, item)
	})

	return entries, nil
}

func main() {
	flag.Parse()

	if HELP {
		flag.Usage()
		os.Exit(1)
	}

	if QUERY == "" {
		fmt.Println("缺少电影名称, `xunso -movie=星球大战`")
		flag.Usage()
		os.Exit(1)
	}

	queryURL := URL + QUERY
	links, _ := ParseLink(queryURL)

	if len(links) == 0 {
		PrintColorful("未能找到电影: "+QUERY+" 的下载资源.", 31)
		os.Exit(1)
	} else {
		PrintColorful("共找到 "+strconv.Itoa(len(links))+" 部<"+QUERY+">的电影", 34)
	}

	for i := 0; i < len(links); i++ {
		fmt.Print(links[i].ID, ", ", links[i].Title, ", ")
		PrintColorful(links[i].URL, 32)
	}

}
